#define  _CRT_SECURE_NO_WARNINGS
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
//class Solution {
//public:
//    vector<vector<int>> levelOrder(TreeNode* root) {
//        vector<vector<int>> v;
//        queue<TreeNode*> q;
//        if (root == nullptr)
//            return v;
//        q.push(root);
//        while (!q.empty())
//        {
//            int size = q.size();
//            v.push_back(vector<int>());
//            for (int i = 0; i < size; i++)
//            {
//                TreeNode* tmp = q.front();
//                q.pop();
//                v.back().push_back(tmp->val);
//                if (tmp->left)
//                {
//                    q.push(tmp->left);
//                }
//                if (tmp->right)
//                {
//                    q.push(tmp->right);
//                }
//            }
//
//        }
//        return v;
//    }
//};
//class Solution {
//public:
//    vector<vector<int>> levelOrderBottom(TreeNode* root) {
//        vector<vector<int>> v;
//        queue<TreeNode*> q;
//        if (root == nullptr)
//            return v;
//        q.push(root);
//        while (!q.empty())
//        {
//            int size = q.size();
//            v.push_back(vector<int>());
//            for (int i = 0; i < size; i++)
//            {
//                TreeNode* tmp = q.front();
//                q.pop();
//                v.back().push_back(tmp->val);
//                if (tmp->left)
//                {
//                    q.push(tmp->left);
//                }
//                if (tmp->right)
//                {
//                    q.push(tmp->right);
//                }
//            }
//
//
//        }
//        reverse(v.begin(), v.end());
//        return v;
//    }
//};
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool FindAncestor(TreeNode* root, TreeNode* x)
    {
        if (root == nullptr)
            return false;
        if (root == x)
            return true;
        return FindAncestor(root->left, x) || FindAncestor(root->right, x);
    }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (root == nullptr)
            return nullptr;
        if (root == p || root == q)
            return root;
        bool pInleft = FindAncestor(root->left, p);
        bool pInright = !pInleft;
        bool qInleft = FindAncestor(root->left, q);
        bool qInright = !qInleft;
        if (qInleft && pInleft)
        {
            return lowestCommonAncestor(root->left, p, q);
        }
        else if (qInright && pInright)
        {
            return lowestCommonAncestor(root->right, p, q);
        }
        else
        {
            return root;
        }
    }
};

